const express = require("express");
const nodejieba = require("nodejieba");

const app = express();

app.get("/", (req, res) => {
  res.send("Hello World!");
});

// 处理 SSE 请求
app.post("/chat", (req, res) => {
  // 设置响应头
  res.setHeader("Content-Type", "text/event-stream");
  res.setHeader("Cache-Control", "no-cache");
  res.setHeader("Connection", "keep-alive");

  const wordList = getWordList(`SSE 的本质。
    严格地说，HTTP 协议无法做到服务器主动推送信息。但是，有一种变通方法，就是服务器向客户端声明，接下来要发送的是流信息（streaming）。
    也就是说，发送的不是一次性的数据包，而是一个数据流，会连续不断地发送过来。这时，客户端不会关闭连接，会一直等着服务器发过来的新的数据流，视频播放就是这样的例子。本质上，这种通信就是以流信息的方式，完成一次用时很长的下载。
    SSE 就是利用这种机制，使用流信息向浏览器推送信息。它基于 HTTP 协议，目前除了 IE/Edge，其他浏览器都支持。`);
  let index = 0;
  let timeout = getRandomInt(50, 200,500,2000);
  // 定时发送消息
  const timer = setInterval(() => {
    timeout = getRandomInt(50, 200,500,2000);
    if (index < wordList.length) {
      // 每秒发送一条消息
      res.write(`data: ${JSON.stringify({ data: wordList[index++] })}\n\n`);
    } else {
      res.end();
    }
  }, timeout);

  // 当客户端断开连接时，清除定时器
  req.on("close", () => {
    clearInterval(timer);
  });
});

function getWordList(text) {
  // 精确模式分词
  //   const result = nodejieba.cut(text);
  // 全模式分词（会列出所有可能的词组）
  const fullModeResult = nodejieba.cut(text, true);
  return fullModeResult;
}

function getRandomInt(min1, max1,min2,max2) {
  return (Math.random()<0.8)?(Math.floor(Math.random() * (max1 - min1 + 1)) + min1):(Math.floor(Math.random() * (max2 - min2 + 1)) + min2);
}

app.listen(3000, () => {
  console.log("Example app listening on port 3000!");
});
